home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / gcc / newgccstart.lha / source.lha / startup / auto.c next >
Encoding:
C/C++ Source or Header  |  1994-03-14  |  2.8 KB  |  111 lines

  1. /*
  2.  * C-Teil des Startup-Codes gibt folgende globalen Links:
  3.  *
  4.  * ULONG __oslibversion;
  5.  *   Ist diese Variable vorhanden dann legt sie die Versionsnummer
  6.  *   der automatisch geöffneten Libraries fest.
  7.  * Default: ULONG __oslibversion=36l;
  8.  *
  9.  * extern int _main(char *commandline);
  10.  *   Ein Low-Level-main mit der dem Kommando folgenden Kommandozeile
  11.  *   als Argument ('\n'-terminiert). Es dürfen _keine_ Funktionen, die
  12.  *   Speicher von der ANSI-C-Library erfordern, benutzt werden.
  13.  *   (Auch nicht fopen()).
  14.  *
  15.  * extern void _exit(int returncode);
  16.  *   Low-Level-exit, das nur die Libraries aufräumt.
  17.  *
  18.  * int _autoinit(void);
  19.  *   Ist diese Funktion vorhanden, dann wird sie bei geöffneten Libraries
  20.  *   vor _main aufgerufen um globale Einstellungen vornehmen zu können.
  21.  * Default: int _autoinit(void){ return(0); }
  22.  *
  23.  * void _autoexit(void);
  24.  *   Ist diese Funktion vorhanden, dann wird sie bei noch geöffneten
  25.  *   Libraries nach _exit aufgerufen um wieder aufräumen zu können.
  26.  * Default: void _autoexit(void){ }
  27.  *
  28.  * extern struct WBStartup *_WBenchMsg;
  29.  *   Die Workbench-Startup-Message oder NULL bei Start von der Shell.
  30.  *
  31.  * extern void geta4(void);
  32.  *   Nur für short-data-model: setzt den global-data segment pointer a4.
  33.  */
  34.  
  35. #include <stdlib.h>
  36. #include <exec/execbase.h>
  37. #include <dos/dosextens.h>
  38. #include <workbench/startup.h>
  39. #ifdef __GNUC__
  40. #include <inline/exec.h>
  41. #endif
  42. #ifndef __GNUC__
  43. #include <clib/exec_protos.h>
  44. #endif
  45.  
  46. struct ExecBase *SysBase=NULL;
  47. struct WBStartup *_WBenchMsg=NULL;
  48. static int autoinitdone=0;
  49.  
  50. extern void *__librarybases;
  51. extern void *__mallocbase;
  52. extern ULONG __oslibversion;
  53. extern int _main(char *commandline);
  54. extern void __aexit(int retval);
  55.  
  56. static void closelibs(void)
  57. {
  58.   struct Library **libptr=(struct Library **)&__librarybases+1;
  59.   while(libptr!=(struct Library **)&__mallocbase)
  60.   {
  61.     if(*libptr!=NULL)
  62.       CloseLibrary(*libptr);
  63.     libptr+=2;
  64.   }
  65. }
  66.  
  67. static void openlibs(void)
  68. {
  69.   ULONG version=__oslibversion;
  70.   struct Library **libptr=(struct Library **)&__librarybases+1;
  71.   while(libptr!=(struct Library **)&__mallocbase)
  72.   {
  73.     if((*libptr=OpenLibrary(*(char **)(libptr+1),version))==NULL)
  74.       _exit(RETURN_FAIL);
  75.     libptr+=2;
  76.   }
  77. }
  78.  
  79. void __amain(char *commandline)
  80. {
  81.   int retval;
  82.   struct Process *thistask;
  83.   struct MsgPort *thisport;
  84.   SysBase=*(struct ExecBase **)4l; /* Open exec.library */
  85.   thistask=(struct Process *)FindTask(NULL);
  86.   if (!thistask->pr_CLI)
  87.   {
  88.     thisport=&thistask->pr_MsgPort; /* Start von der Workbench */
  89.     WaitPort(thisport);
  90.     _WBenchMsg=(struct WBStartup *)GetMsg(thisport);
  91.   }
  92.   openlibs();
  93.   if (retval=_autoinit())
  94.     _exit(retval);
  95.   autoinitdone=1;
  96.   _exit(_main(commandline));
  97. }
  98.  
  99. void _exit(int returncode)
  100. {
  101.   if (autoinitdone)
  102.     _autoexit();
  103.   closelibs();
  104.   if (_WBenchMsg)
  105.   {
  106.     Forbid();
  107.     ReplyMsg((struct Message *)_WBenchMsg);
  108.   }
  109.   __aexit(returncode);
  110. }
  111.